package com.yzq.manager.WebSocket.disruptor;

import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;

import com.yzq.manager.WebSocket.model.PictureEditRequestMessage;
import com.yzq.model.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * 图片编辑事件生产者
 * 负责将图片编辑事件发布到Disruptor队列中，供消费者处理
 */
@Component
@Slf4j
public class PictureEditEventProducer {

    /**
     * 注入Disruptor实例，用于处理图片编辑事件
     * Disruptor是一个高性能的异步处理框架，适用于高并发场景
     */
    @Resource
    private Disruptor<PictureEditEvent> pictureEditEventDisruptor;

    /**
     * 发布图片编辑事件到Disruptor队列
     *
     * @param pictureEditRequestMessage 图片编辑请求消息，包含编辑类型和数据
     * @param session                   WebSocket会话，用于与客户端通信
     * @param user                      当前操作用户信息
     * @param pictureId                 图片ID，标识正在编辑的图片
     */
    public void publishEvent(PictureEditRequestMessage pictureEditRequestMessage, WebSocketSession session, UserVO user, Long pictureId) {
        // 获取Disruptor的环形缓冲区
        RingBuffer<PictureEditEvent> ringBuffer = pictureEditEventDisruptor.getRingBuffer();
        
        // 获取下一个可用的序列号（位置），用于放置事件
        long next = ringBuffer.next();
        
        try {
            // 根据序列号获取对应的事件对象
            PictureEditEvent pictureEditEvent = ringBuffer.get(next);
            
            // 设置事件属性
            pictureEditEvent.setPictureEditRequestMessage(pictureEditRequestMessage);
            pictureEditEvent.setSession(session);
            pictureEditEvent.setUser(user);
            pictureEditEvent.setPictureId(pictureId);
        } finally {
            // 发布事件，通知消费者处理
            ringBuffer.publish(next);
        }
    }

    /**
     * 优雅停机方法
     * 在Spring容器关闭时自动调用，确保所有事件处理完成后再关闭Disruptor
     */
    @PreDestroy
    public void destroy() {
        log.info("正在关闭图片编辑事件Disruptor...");
        pictureEditEventDisruptor.shutdown();
        log.info("图片编辑事件Disruptor已关闭");
    }
}

